﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SQLite;
using System.Text;
using BLToolkit.Data;
using PMIS.BLL.Post;
using PMIS.BLL.System;

namespace PMIS.BLL.User
{
	/// <summary>
	/// 人员管理
	/// </summary>
	public class BL_人员 : BL_Common<人员>
	{
		/// <summary>
		/// 查询
		/// </summary>
		/// <param name="item">查询参数</param>
		/// <param name="pp">分页参数</param>
		/// <returns></returns>
		public DataTable Query(UserQueryParamer item, ref PagingParameter pp)
		{
			if (item == null)
				return null;

			DataTable result = null;
			DbManager dm = null;
			try
			{
				//	创建数据库连接
				dm = BL_DatabaseConnection.CreateConnection();

				List<IDbDataParameter> Params = new List<IDbDataParameter>();
				StringBuilder sbSQL = new StringBuilder();
				sbSQL.Append("Select US.*, DE.名称 AS 部门名称, DE.路径 AS 部门路径 ");
				sbSQL.Append("From 人员 US ");
				//	为了显示所属部门增加关联查询
				sbSQL.Append("Left Join 部门 DE On US.部门班组ID = DE.ID ");
				//	加入岗位查询后会有重复记录,所以多了一层distinct
				sbSQL.Append("Inner Join (Select Distinct U.ID From 人员 U ");
				//	关联部门班组表
				sbSQL.Append("Left Join 部门 D On U.部门班组ID = D.ID ");
				StringBuilder sbWhere = new StringBuilder();
				sbWhere.Append("Where 1=1 ");
				//	工号
				if (!string.IsNullOrEmpty(item.工号))
				{
					sbWhere.Append("And U.工号 Like '%' || @工号 || '%' ");
					Params.Add(new SQLiteParameter("工号", item.工号));

				}
				//	姓名
				if (!string.IsNullOrEmpty(item.姓名))
				{
					sbWhere.Append("And U.姓名 Like '%' || @姓名 || '%' ");
					Params.Add(new SQLiteParameter("姓名", item.姓名));
				}
				//	性别
				if (!string.IsNullOrEmpty(item.性别))
				{
					sbWhere.Append("And U.性别 = @性别 ");
					Params.Add(new SQLiteParameter("性别", item.性别));
				}
				//	岗位代码
				if (!string.IsNullOrEmpty(item.岗位代码))
				{
					sbWhere.Append("And U.岗位代码 Like '%' || @岗位代码 || '%' ");
					Params.Add(new SQLiteParameter("岗位代码", item.岗位代码));
				}
				//	身份证号码
				if (!string.IsNullOrEmpty(item.身份证号码))
				{
					sbWhere.Append("And U.身份证号码 Like '%' || @身份证号码 || '%' ");
					Params.Add(new SQLiteParameter("身份证号码", item.身份证号码));
				}
				//	部门
				if (!string.IsNullOrEmpty(item.部门班组))
				{
					sbWhere.Append("And D.路径 Like '%' || @部门班组 || '%' ");
					Params.Add(new SQLiteParameter("部门班组", item.部门班组));
				}
				//	岗位
				if (!string.IsNullOrEmpty(item.岗位))
				{
					sbWhere.Append("And U.岗位 Like '%' || @岗位 || '%' ");
					Params.Add(new SQLiteParameter("岗位", item.岗位));
				}
				//	备注
				if (!string.IsNullOrEmpty(item.备注))
				{
					sbWhere.Append("And U.备注 Like '%' || @备注 || '%' ");
					Params.Add(new SQLiteParameter("备注", item.备注));
				}
				//	出生时间_开始
				if (item.出生时间_开始.HasValue)
				{
					sbWhere.Append("And U.出生时间 >= @出生时间_开始 ");
					Params.Add(new SQLiteParameter("出生时间", item.出生时间_开始.Value));
				}
				//	出生时间_结束
				if (item.出生时间_结束.HasValue)
				{
					sbWhere.Append("And U.出生时间 < @出生时间_结束 ");
					Params.Add(new SQLiteParameter("出生时间_结束", item.出生时间_结束.Value));
				}
				//	工作时间_开始
				if (item.工作时间_开始.HasValue)
				{
					sbWhere.Append("And U.工作时间 >= @工作时间_开始 ");
					Params.Add(new SQLiteParameter("工作时间", item.工作时间_开始.Value));
				}
				//	工作时间_结束
				if (item.工作时间_结束.HasValue)
				{
					sbWhere.Append("And U.工作时间 < @工作时间_结束 ");
					Params.Add(new SQLiteParameter("工作时间_结束", item.工作时间_结束.Value));
				}
				if (!string.IsNullOrEmpty(item.岗位ID))
				{
					//	岗位等级定义
					List<岗位_等级> pl = dm.SetCommand("Select U.* From 岗位_等级 U Where U.岗位ID = @ID ",
						dm.Parameter("ID", item.岗位ID))
						.ExecuteList<岗位_等级>();
					if (pl == null)
						throw new Exception("查询人员信息时发生错误:不能查询岗位等级定义!");

					foreach (string kind in BL_岗位.岗位分类)
					{
						List<岗位_等级> levels = pl.FindAll(t => t.分类 == kind);
						if (levels.Count == 0)
							continue;			//	对该分类无要求

						StringBuilder sbID = new StringBuilder();
						levels.ForEach(t => sbID.Append(t.等级ID));

						string tablename = kind == "职称" ? "职业_职称" :
							kind == "从业资格" ? "职业_从业资格" :
							kind == "执业资格" ? "职业_执业资格" :
							kind == "职业资格" ? "职业_职业资格" :
							kind == "厂内机动车" ? "特种_厂内机动车" :
							kind == "电工" ? "特种_电工" :
							kind == "焊工" ? "特种_焊工" :
							kind == "起重" ? "特种_起重" :
							kind == "带电作业" ? "其他_带电作业" :
							kind == "电工进网" ? "其他_电工进网" :
							kind == "电力行政执法" ? "其他_电力行政执法" :
							kind == "概预算" ? "其他_概预算" :
							kind == "计量检定" ? "其他_计量检定" :
							kind == "用电检查" ? "其他_用电检查" :
							kind == "油气检查" ? "其他_油气检查" :
							kind == "管理" ? "岗培_管理" :
							kind == "其他人员" ? "岗培_其他人员" :
							kind == "安规100" ? "准入_安规100" :
							kind == "安全技能" ? "准入_安全技能" :
							kind == "三种人" ? "准入_三种人" : string.Empty;

						sbSQL.AppendFormat("Inner Join {0} On U.ID = {0}.USER_ID) ", tablename);
						//	为给表[人员]前加括号,Access独特的需要
						sbSQL.Insert(58, "(");

						//	查询条件
						//sbWhere.AppendFormat("And Instr('{0}', {1}.岗位等级ID) > 0 ", sbID.ToString(), tablename);
						sbWhere.AppendFormat("And {0}.岗位等级ID Like  '%' || '{1}' || '%' ", tablename, sbID.ToString());
					}
				}
				//	加上查询条件
				sbSQL.Append(sbWhere.ToString());
				//	加上关联条件
				sbSQL.Append(") T On T.ID = US.ID");

				//	查询
				result = PageQuery(sbSQL.ToString(), Params, ref pp, dm);
			}
			catch (Exception ex)
			{
				BL_ExceptionOperation.WriteException(ex);
				result = null;
			}
			finally
			{
				if (dm != null)
				{
					dm.Close();
					dm.Dispose();
				}
			}

			return result;
		}
	}

	#region 人员查询参数
	/// <summary>
	/// 人员查询参数
	/// </summary>
	public class UserQueryParamer
	{
		/// <summary>
		/// 工号
		/// </summary>
		public string 工号 { get; set; }
		/// <summary>
		/// 姓名
		/// </summary>
		public string 姓名 { get; set; }
		/// <summary>
		/// 性别
		/// </summary>
		public string 性别 { get; set; }
		/// <summary>
		/// 部门
		/// </summary>
		public string 部门班组 { get; set; }
		/// <summary>
		/// 岗位
		/// </summary>
		public string 岗位 { get; set; }
		/// <summary>
		/// 岗位代码
		/// </summary>
		public string 岗位代码 { get; set; }
		/// <summary>
		/// 出生时间_开始
		/// </summary>
		public DateTime? 出生时间_开始 { get; set; }
		/// <summary>
		/// 出生时间_结束
		/// </summary>
		public DateTime? 出生时间_结束 { get; set; }
		/// <summary>
		/// 工作时间_开始
		/// </summary>
		public DateTime? 工作时间_开始 { get; set; }
		/// <summary>
		/// 工作时间_结束
		/// </summary>
		public DateTime? 工作时间_结束 { get; set; }
		/// <summary>
		/// 身份证号码
		/// </summary>
		public string 身份证号码 { get; set; }
		/// <summary>
		/// 备注
		/// </summary>
		public string 备注 { get; set; }
		/// <summary>
		/// 岗位ID
		/// </summary>
		public string 岗位ID { get; set; }
	}
	#endregion
}
